{# THE chat surface: thread, jump button, staged images, composer. The AI page's Chat section includes it and the drawer fetches it; there is one instance on a page at a time (the drawer empties while the Chat section shows), so the ids the scripts and the composer target stay unique. Needs: assistant, chat_path, stream_url, turn_defaults, messages, conversation_id, picker (the catalog is there to pick from), voice (how a spoken turn is heard, or none), approvals (the change queue's review list's URL, or none), voices (profiles and live calls: voice with a database). #} {% from "components/macros/icons.html" import icon %} {% from "components/macros/chat.html" import assistant_row, button_classes, conversation_field, voice_states %} {# A call's states, as the phone and the call bar both draw them. #} {% macro phone_states() %}{% call voice_states(record=True, work=True) %}{{ icon("phone", "w-4 h-4") }}{% endcall %}{% endmacro %}